package dao;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import hbt.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import Dominio.OrdenDePedido;
import Dominio.Remito;

public class RemitoDAO {

	private static RemitoDAO instancia = null;
	private static SessionFactory sf = null;
	private Session session = null;

	public static RemitoDAO getInstancia() {
		if (instancia == null) {
			sf = HibernateUtil.getSessionFactory();
			instancia = new RemitoDAO();
		}
		return instancia;
	}

	private Session getSession() {
		if (session == null)
			session = sf.openSession();
		return session;
	}

	public void closeSession() {
		if (session != null)
			session.close();
	}

	public void crearRemito(Remito rem) throws Exception {
		try {
			Session s=getSession();
			s.beginTransaction();
			//s.saveOrUpdate(rem);
			s.persist(rem);
			s.flush();
			s.getTransaction().commit();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("unchecked")
	public List<Remito> obtenerRemitos(String estado) 
	{
		try
		{
			List<Remito> lisFinal = new ArrayList<Remito>(); 
			Session s = this.getSession();
			s.beginTransaction();
	
			List<OrdenDePedido> lista= (List<OrdenDePedido>)s.createQuery("select OP from OrdenDePedido OP where OP.estado = :estado)").setParameter("estado", estado).list();
			
			for (OrdenDePedido ordenDePedido : lista) 
			{
				Remito rem = new Remito();
				rem.setCliente(ordenDePedido.getCliente());
				rem.setEstado("Pendiente");
				rem.setFechaEmision(Calendar.getInstance().getTime());
				rem.setFechaEnvio(ordenDePedido.getFechaPedido());
				rem.setOrdenpedido(ordenDePedido);
				lisFinal.add(rem);
			}		
		
			s.getTransaction().commit();
			return lisFinal;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}

	public int obtenerUltimoNro() 
	{
		try
		{
			Session s=getSession();
			s.beginTransaction();
			int ultimo = 0;
			int aux = (Integer)s.createQuery("Select max(r.nroRemito) from Remito r").uniqueResult();
			if (aux > 0)
			{	
				ultimo = aux;
			}
			s.flush();
			s.getTransaction().commit();
			return ultimo;
		}
		catch(Exception e)
		{
			return 0;
		}
	}

	public Remito obtenerRemitoNro(int nroRemito) 
	{
		try
		{
			Session s=getSession();
			s.beginTransaction();
			Remito rem = (Remito)s.createQuery("Select r from Remito r where r.nroRemito = :nro").setParameter("nro", nroRemito).uniqueResult();
			s.flush();
			s.getTransaction().commit();
			return rem;
		}
		catch(Exception e)
		{
			return null;
		}
	}

	public void actualizarRemito(Remito remfinal) 
	{
		try
		{
			Session s = getSession();
			s.beginTransaction();			
			s.saveOrUpdate(remfinal);
			//sc.setId(sc.getId());
			//s.persist(sc);
			s.flush();
			s.getTransaction().commit();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
	}

	@SuppressWarnings("unchecked")
	public List<Remito> buscarRemitos(String estado) 
	{
		try
		{
			Session s=getSession();
			s.beginTransaction();
			List<Remito> rem = (List<Remito>)s.createQuery("Select r from Remito r where r.estado = :estado").setParameter("estado", estado).list();
			s.flush();
			s.getTransaction().commit();
			return rem;
		}
		catch(Exception e)
		{
			return null;
		}
	}

	
}
